﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace AdvEditor {

    /// <summary>
    /// AdvEditorで使用するダイアログの基底クラス
    /// </summary>
    /// <remarks>abstractにしたいがデザイナに怒られるのでしぶしぶprotectedにしておく。</remarks>
    public partial class DialogBase : Form {

        /// <summary>
        /// コンストラクタ。外部からは呼び出せない。
        /// </summary>
        protected DialogBase() {
            InitializeComponent();
        }

        /// <summary>
        /// ポップアップヘルプを指定したコントロールに表示する。通常HelpRequestedの中から呼ぶ。
        /// </summary>
        /// <seealso cref="http://www.atmarkit.co.jp/fdotnet/dotnettips/383popuphelp2/popuphelp2.html"/>
        /// <param name="ctrl">対象のコントロール</param>
        /// <param name="message">表示するヘルプメッセージ</param>
        protected void ShowPopupHelp(Control ctrl, string message) {
            if (ctrl == null) {
                return;
            }
            // マウス座標（スクリーン座標系）の取得
            Point mouseScreenPos = Control.MousePosition;
            // マウス座標をクライアント座標系へ変換
            Point mouseClientPos = ctrl.PointToClient(mouseScreenPos);
            // コントロールのクライアント領域を取得
            Rectangle rect = ctrl.ClientRectangle;
            // マウス座標（クライアント座標系）が領域内かどうか
            bool inside = rect.Contains(mouseClientPos);
            // マウス座標がコントロールの内部のとき
            if (inside) {
                // ポップアップ・ヘルプを表示する
                Help.ShowPopup(ctrl, message,  mouseScreenPos);
            // 外部のとき
            } else {
                // コントロールの下辺中央の位置を取得する
                Point ctrlClietnPos = new Point(ctrl.Size.Width / 2, ctrl.Size.Height);
                // 取得した位置をスクリーン座標系に変換する
                Point ctrlScreenPos = ctrl.PointToScreen(ctrlClietnPos);
                // ポップアップ・ヘルプを表示する
                Help.ShowPopup(ctrl,  message, ctrlScreenPos);
            }
        }
        /// <summary>
        /// ポップアップヘルプを表示する。
        /// イベントハンドラのsenderをキャストするのが面倒なので自動でやってくれるバージョン。
        /// </summary>
        /// <param name="sender">HelpRequestedイベントハンドラに投げられたsender</param>
        /// <param name="message">表示するヘルプメッセージ</param>
        protected void ShowPopupHelp(object sender, string message) {
            ShowPopupHelp(sender as Control, message);
        }
            
    }
}